const ERROR = false; //错误
const SUCCESS = true; // 成功
// 这里是所有规则
export const RULE_MAP = {
    require: (val) => {
        if (
            (val !== 0 && !val) ||
            val === null ||
            val == undefined ||
            (Array.isArray(val) && val.length === 0)
        ) {
            return ERROR
        }
        return SUCCESS;
    },
    number: (val) => {
        if (typeof val !== 'number' || isNaN(Number(val))) {
            return ERROR
        }
        return SUCCESS;
    },
    phone: (val) => {
        if (!(/^[1][3,4,5,6,7,8,9][0-9]{9}$/.test(val))) {
            return ERROR
        }
        return SUCCESS;
    },
    string: (val) => {
        if (typeof val !== 'string') {
            return ERROR
        }
        return SUCCESS;
    },
    abs: (val) => {
        if (val < 0) {
            return ERROR
        }
        return SUCCESS;
    },
    same: (val, { val_2 }) => {
        if (val !== val_2) return ERROR
        return SUCCESS;
    },
    max: (val, { max }) => {
        if (val > max) return ERROR
        return SUCCESS;
    },
    min: (val, { min }) => {
        if (val < min) return ERROR
        return SUCCESS;
    },
    range: (val, { min, max }) => {
        if ((val < min) || (val > max)) {
            return ERROR
        }
        return SUCCESS;
    }
}
/**
 * @desc  验证通过返回 true 否则 false 
 * @param {object} form 表单数据
 * @param {Function} showToast 提示函数
 * @returns {boolean}  验证不通过时返回false,否则 true
 * @example validate({
        code: {
          rule: [ { msg:'提示文字', name:'规则名字', ...其他参数 },..其他规则 ],  方式1 arr
         // rule: { msg:'提示文字', name:'规则名字', ...其他参数 } ,  方式2 object 
          value: new_code, // 要验证的值
        }
    })
 */
export function validate(form, showToast) {
  const that = this;
  // 传入空 或 空对象 都为true
  if (!form || Object.keys(form).length == 0) return true;
  // 遍历传进来的对象
  for (const key in form) {
    // 跳过 找不到的属性 
    if (!form.hasOwnProperty(key)) continue;
    const Field = form[key]; // 取出每一个字段
    let rules = Field.rule || []; // 取出每一个字段的验证规则  
    if (!Array.isArray(rules) && typeof rules === "object") {
      // 兼容简写rule, 包装 {} 成 [ {} ]
      rules = [rules]
    }
    // 遍历当前的规则
    for (const item_rule of rules) {
      // 结构规则里面的参数
      const { msg, name, value = Field.value } = item_rule;
      const callback = RULE_MAP[name]; // 取出对应的验证函数
      if (!callback){
        console.warn(`验证${key}时,出现未知规则name=${name}`)
        continue
      };
      const result = callback(value, item_rule);
      // 判断是否错误
      if (result === ERROR) {
        showToast.call(this,msg)
        return false;
        break
      }

    } 

  }
  return true;
} 
// 待开发...
// 用实例代替函数
class validator {
  constructor(config){
    
  };
  validate = validate;
}